package edu.uoc.vmerinom.tfc.action;

import java.util.List;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

import edu.uoc.vmerinom.tfc.domain.Grupo;
import edu.uoc.vmerinom.tfc.service.GruposService;
import edu.uoc.vmerinom.tfc.support.Message;
import edu.uoc.vmerinom.tfc.support.Utils;

/**
 * Menajedor que contiene las acciones relacionadas con la gestión de los
 * grupos.
 * 
 * @author Víctor Manuel Merino Martínez
 * 
 */
@Name("gruposAction")
@Scope(ScopeType.CONVERSATION)
public class GruposAction {
	/**
	 * Default Serial Version ID.
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * Servicio de grupos.
	 */
	@In(create = true)
	GruposService gruposService;

	/**
	 * Grupo seleccionado.
	 */
	Grupo grupo;

	/**
	 * Listado de grupos.
	 */
	List<Grupo> grupos;

	/**
	 * Lógico que indica si se mostrará el listado de grupos.
	 */
	boolean listarGrupos;

	/**
	 * Lógico que indica si se mostrará la edición de grupo.
	 */
	boolean editarGrupo;

	/**
	 * Carga los datos necesarios antes de mostrar la pantalla inicial.
	 */
	public void load() {
		grupos = gruposService.obtenerGrupos();
		listarGrupos = true;
		editarGrupo = false;
	}

	/**
	 * Carga los datos necesarios para crear un grupo.
	 */
	public void nuevo() {
		grupo = new Grupo();
		listarGrupos = false;
		editarGrupo = true;
	}

	/**
	 * Carga los datos necesarios para editar el grupo seleccionado.
	 */
	public void editar() {
		listarGrupos = false;
		editarGrupo = true;
	}

	/**
	 * Guarda los datos del nuevo grupo insertado.
	 */
	public void guardarNuevoGrupo() {
		if (validar()) {
			gruposService.insertarModificarGrupo(grupo);
			load();
			Message.info("bands.info.save.success");
		}
	}

	/**
	 * Guarda los datos del grupo modificado.
	 */
	public void guardarModificacionGrupo() {
		if (validar()) {
			gruposService.insertarModificarGrupo(grupo);
			grupos = gruposService.obtenerGrupos();
			editarGrupo = false;
			listarGrupos = true;
			Message.info("bands.info.edit.success");
		}
	}

	/**
	 * Valida los campos del grupo.
	 * 
	 * @return <code>true</code> si la validación de campos es correcta.
	 *         <code>false</code> en caso contrario.
	 */
	private boolean validar() {
		boolean result = true;
		if (grupo.getNombre() == null) {
			Message.error("bands.error.name.null");
			result = false;
		} else if ("".equals(Utils.deleteBlankSpaces(grupo.getNombre()))) {
			Message.error("bands.error.name.null");
			result = false;
		} else {
			final Grupo gru = gruposService.obtenerGrupo(grupo.getNombre(), grupo.getId());
			if (gru != null) {
				final Object[] params = new String[1];
				params[0] = grupo.getNombre();
				Message.error("bands.error.name.repeated", params);
				result = false;
			}
		}
		if (grupo.getAlta() == null) {
			Message.error("bands.error.registration.date.null");
			result = false;
		}
		return result;
	}

	/**
	 * Carga los datos necesarios para mostrar la pantalla de vuelta.
	 */
	public void volver() {
		gruposService.actualizarEstadoGrupo(grupo);
		listarGrupos = true;
		editarGrupo = false;
	}

	public Grupo getGrupo() {
		return grupo;
	}

	public void setGrupo(Grupo grupo) {
		this.grupo = grupo;
	}

	public List<Grupo> getGrupos() {
		return grupos;
	}

	public void setGrupos(List<Grupo> grupos) {
		this.grupos = grupos;
	}

	public boolean isListarGrupos() {
		return listarGrupos;
	}

	public void setListarGrupos(boolean listarGrupos) {
		this.listarGrupos = listarGrupos;
	}

	public boolean isEditarGrupo() {
		return editarGrupo;
	}

	public void setEditarGrupo(boolean editarGrupo) {
		this.editarGrupo = editarGrupo;
	}
}
